StupidBeauty
Read times:820Posted at:Sun Oct 13 18:19:46 2013
- no title specified

iOS开发文档翻译:核心数据编程指南/被管理的对象模型,Core Data Programming Guide/Managed Object Models

被管理对象模型(Managed Object Models)

Core Data的大部分功能取决于妳所创建的用于描述程序中的实体、实体的属性及实体之间关系的模式(schema)。模式是由一个被管理对象模型来表示的—即是一个NSManagedObjectModel 实例。通常来讲,模型信息越丰富,Core Data 就能越好地支持妳的程序。此文章说明的是,一个被管理对象模型所具有的特性、妳如何创建它,以及如何在妳的程序中使用它。

被管理对象模型的特性

一个 被管理对象模型 ,是 NSManagedObjectModel 类的一个实例。它描述了一个模式—即一组实体—妳将会在自己的程序中使用这个模式。(如果妳不理解“实体”这个术语—或者相关的术语"属性(property)"、"属性(attribute)"和"关系"—则,妳应当先阅读“Core Data基础”“对象建模”。)

实体

一个模型中会包含NSEntityDescription 对象,它们代表着该模型的实体。对于一个实体,有两个特性是非常重要的,一个是它的名字,另一个是在运行时用来代表此实体的类的名字。妳应当仔细区分开这三个东西:一个实体;用来表示此实体的类;是该实体的实例的那些被管理对象

一个NSEntityDescription 对象,可能会拥有一些NSAttributeDescription NSRelationshipDescription 对象,它们代表着该模式中该实体的属性。一个实体还可能拥有已获取的属性(fetched properties),它们由NSFetchedPropertyDescription 的实例来表示。而模型本身可能拥有取信息请求模板(fetch request templates),由NSFetchRequest 的实例来表示。

在模型中,那些实体可能会被按照树形结构组织起来,而且有些实体可能会被指定为抽象的(abstract)。

实体继承

实体继承与类继承是类似的,也因为相同的原因而成为有用的特性。如果妳拥有一些非常相似的实体,那么,妳可以将其中的共有属性提取出来成为一个超实体(super-entity)。妳不用在多个实体中都定义相同的属性,只需要将相同的属性定义到某个实体中再使用子实体(sub-entities)继承它就可以了。例如,妳可以定义一个(Person)实体,它拥有(firstName)和(lastName)两个属性,然后定义子实体雇员(Employee)和顾客(Customer),它们继承了这些属性。

在狠多情况下,妳还会实现一个自定义类,它对应于那个超实体,并且让那些对应于子实体的类继承这个类。不需要在所有类中都重复实现那些对各个实体都相同的业务逻辑,只需要在超类中实现它们,再由子类来继承就可以了。

如果妳使用 Xcode 中的数据建模工具来创建模型的话,则可以在实体的信息(Info)面板中的亲代(Parent)弹出菜单里选择目标实体名字,以此来指定某个实体的亲代实体,见图 1

图 1 在Xcode中选择一个亲代实体

如果妳想通过代码来创建一个实体继承树的话,则必须从上至下构建这棵树。妳无法直接设置一个实体的超实体,妳只能设置某个实体的子实体(使用这个方法setSubentities:)。所以,要想为某个指定的实体设置其超实体的话,妳必须为那个超实体设置一个子实体数组,其中就要包括当前的那个实体。

抽象实体

妳可以将某个实体指定为抽象的—即,妳不会创建那个实体的任何实例。通常在这种情况下需要将一个实体设置成抽象的:妳拥有一组实体,它们各自都代表着某个普通实体的变种(继承自该普通实体),而该普通实体本身却不应当被实例化。例如,在一个绘图程序中,妳可能会有一个图形(Graphic)实体,它定义了x坐标、y坐标、颜色和绘图区域属性。但是,妳不会实例化一个 图形 实体。具体的(即,可实例化的) 图形 实体的子实体可能包括: (Circle)、 文字区域 (TextArea)和 线 (Line)。

属性(Properties)

一个实体的属性(properties)包括:它的值属性(attributes)和关系,以及它的被获取的属性(fetched properties)(如果有的话)。除了其它特性之外,每个属性都有一个名字和类型。值属性还可能会拥有一个默认值。一个属性名字不能与NSObject NSManagedObject 的任何非参数(no-parameter)方法的名字相同—例如,妳不能将一个属性的名字设置为“描述”(“description”)(参考 NSPropertyDescription )。

透明(Transient)属性,指的是,那些妳定义在模型中却不会被保存到持久化存储中去的属性。Core Data仍然会跟踪那些透明属性上所发生的变更,所以,也可以对它们进行撤销操作。

注意:如果妳对一个使用了未建模信息的透明属性做撤销操作的话,Core Data不会使用旧的值来调用妳的赋值访问函数(set accessor)—它只会简单地更新对应的快照信息。

值属性

Core Data原生地就支持多种值属性类型,例如字符串、日期和整数(分别由NSStringNSDateNSNumber实例来表示)。如果妳想使用一种并非原生支持的值属性类型,则,可以按照“非标准的持久化 值属性 中所说的那些技巧来实现。

妳可以将某个值属性指定为可选的—即,它不一定要拥有一个值。然而,通常来讲,我们不鼓励这么做—尤其是对于数字类型的值(一般情况下,妳可以通过在模型中使用一个带默认值0的必选值属性来产生更好的结果)。这么说的原因是,结构化查询语言(SQL)当中,对于空值NULL)有特殊的比较行为,这一点与Objective-C 中的空值nil)不一样。数据库中的空值0 是不同的,因此,以 0 作为条件来搜索时,不会命中那些具有空值的列。

false == (NULL == 0)

false == (NULL != 0)

而且,数据库中的空值也不等价于一个空字符串或一个空的二进制数据块(data blob):

false == (NULL == @"")

false == (NULL != @"")

这一点对于关系是无影响的。

关系

Core Data支持对一(to-one)和对多(to-many)关系,还有被获取的属性fetched properties)。被获取的属性表示的是弱的、单向的关系。具体拿雇员和部门这个例子来说,“最近招聘的雇员”就可以作为某个部门的一个被获取的属性来处理(雇员对象不具有对于最近招聘的雇员这个关系的反向引用)。

妳可以指定一个关系的可选性、基数(cardinality)和删除规则。一般情况下,妳应当对一个关系进行双向的建模。对于一个多对多(many-to-many)关系来说,它在两个方向上的关系都是对多的。在“关系及 被获取的属性 中对于关系有更详细的说明。

取数据请求模板

妳使用NSFetchRequest 类来描述取信息请求,再用取信息请求来从一个持久化存储中获取对象。经常会遇到的一种情况就是,妳会在多个时机执行相同的请求,或者是执行一些模式(pattern)固定却带有变量元素(通常由用户提供)的请求。例如,妳可能需要在运行时查询出用户所指定的某位作家在某个日期之后发布的所有作品。

妳可以预先定义好取信息请求,将它们作为命名模板储存在一个被管理对象模型中。这样就可以从模型中预定义出妳所需要的查询了。一般情况下,妳会使用 Xcode 的数据建模工具(参考Xcode中用于 Core Data的工具)来定义取信息请求模板(fetch request templates)。模板中可以包含变量,见图 2。

图 2 Xcode断言(predicate)构建器

参考“在运行时访问及使用一个 被管理对象模型 ,以了解更多关于使用取信息请求模板的信息。

用户信息字典

在一个被管理对象模型中的狠多元素—实体、值属性和关系—都有一个相关联的用户信息字典。妳可以将任何信息以键-值对的方式储存在一个用户信息字典中。常见的会放入用户信息字典的信息包括:一个实体的版本信息;用于一个 被获取的属性 中的断言的值。

配置

一个配置,拥有一个名字及相关联的一组实体。实体的集合可能会重叠—即,某个指定的实体可能会出现在超过一个配置当中。妳可以通过代码使用来建立配置 setEntities:forConfiguration: ,或者使用Xcode 的数据建模工具(参考Xcode中用于Core Data的工具)来建立配置。之后可使用 entitiesForConfiguration: 来获取某个配置名字对应的实体集合。

一般当妳想要将不同实体储存在不同的存储中时,会使用配置。一个持久化存储协调器只能拥有一个被管理对象模型,所以,默认情况下,与指定的协调器相关联的每个存储都必须包含有相同的实体集合。为咯绕开这个限制,妳可以创建一个模型,其中包含有妳想要使用的所有实体。然后,针对妳想要使用的实体的每种组合情况,分别在模型中为之创建一个配置。然后,当妳创建一个协调器时,就可以使用这个模型了。当妳添加存储时,通过配置来指定不同的存储值属性。但是,当妳在创建配置时,要记住一点,妳无法创建跨存储(cross-store)的关系。

刘云

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4